//SPDX-FileCopyrightText: Copyright 2022-2024 深圳市同心圆网络有限公司
//SPDX-License-Identifier: GPL-3.0-only

package idea_store_api_serv

import (
	"context"

	"atomgit.com/openlinksaas/api-server/dao/idea_dao"
	"atomgit.com/openlinksaas/proto-gen-go.git/idea_store_api"
)

type IdeaStoreApiImpl struct {
	idea_store_api.UnimplementedIdeaStoreApiServer
}

func (apiImpl *IdeaStoreApiImpl) ListStoreCate(ctx context.Context, req *idea_store_api.ListStoreCateRequest) (*idea_store_api.ListStoreCateResponse, error) {
	cateItemList, err := idea_dao.IdeaStoreCateDao.List(ctx)
	if err != nil {
		return nil, err
	}

	cateList := []*idea_store_api.IdeaStoreCate{}
	for _, cateItem := range cateItemList {
		cateList = append(cateList, cateItem.ToIdeaStoreCate())
	}

	return &idea_store_api.ListStoreCateResponse{
		Code:     idea_store_api.ListStoreCateResponse_CODE_OK,
		CateList: cateList,
	}, nil
}

func (apiImpl *IdeaStoreApiImpl) ListStore(ctx context.Context, req *idea_store_api.ListStoreRequest) (*idea_store_api.ListStoreResponse, error) {
	if req.FilterByStoreCateId {
		exist, err := idea_dao.IdeaStoreCateDao.Exist(ctx, req.StoreCateId)
		if err != nil {
			return nil, err
		}
		if !exist {
			return &idea_store_api.ListStoreResponse{
				Code:      idea_store_api.ListStoreResponse_CODE_NO_STORE_CATE,
				ErrMsg:    "知识点仓库分类不存在",
				StoreList: []*idea_store_api.IdeaStore{},
			}, nil
		}
	}

	storeItemList, err := idea_dao.IdeaStoreDao.List(ctx, req.FilterByStoreCateId, req.StoreCateId)
	if err != nil {
		return nil, err
	}
	storeList := []*idea_store_api.IdeaStore{}
	for _, storeItem := range storeItemList {
		storeList = append(storeList, storeItem.ToIdeaStore())
	}

	return &idea_store_api.ListStoreResponse{
		Code:      idea_store_api.ListStoreResponse_CODE_OK,
		StoreList: storeList,
	}, nil
}

func (apiImpl *IdeaStoreApiImpl) GetStore(ctx context.Context, req *idea_store_api.GetStoreRequest) (*idea_store_api.GetStoreResponse, error) {
	storeItem, err := idea_dao.IdeaStoreDao.Get(ctx, req.IdeaStoreId)
	if err != nil {
		return &idea_store_api.GetStoreResponse{
			Code:   idea_store_api.GetStoreResponse_CODE_NO_STORE,
			Store:  &idea_store_api.IdeaStore{},
			ErrMsg: "知识点仓库不存在",
		}, nil
	}
	return &idea_store_api.GetStoreResponse{
		Code:  idea_store_api.GetStoreResponse_CODE_OK,
		Store: storeItem.ToIdeaStore(),
	}, nil
}

func (apiImpl *IdeaStoreApiImpl) ListIdea(ctx context.Context, req *idea_store_api.ListIdeaRequest) (*idea_store_api.ListIdeaResponse, error) {
	if req.ListParam.FilterByStoreId {
		exist, err := idea_dao.IdeaStoreDao.Exist(ctx, req.ListParam.StoreId)
		if err != nil {
			return nil, err
		}
		if !exist {
			return &idea_store_api.ListIdeaResponse{
				Code:     idea_store_api.ListIdeaResponse_CODE_NO_STORE,
				IdeaList: []*idea_store_api.IdeaInStore{},
			}, nil
		}
	}

	count, err := idea_dao.StoreIdeaDao.Count(ctx, req.ListParam)
	if err != nil {
		return nil, err
	}
	ideaItemList, err := idea_dao.StoreIdeaDao.List(ctx, req.ListParam, int64(req.Offset), int64(req.Limit), 1)
	if err != nil {
		return nil, err
	}

	ideaList := []*idea_store_api.IdeaInStore{}
	for _, ideaItem := range ideaItemList {
		ideaList = append(ideaList, ideaItem.ToIdeaInStore())
	}

	return &idea_store_api.ListIdeaResponse{
		Code:       idea_store_api.ListIdeaResponse_CODE_OK,
		TotalCount: count,
		IdeaList:   ideaList,
	}, nil
}

func (apiImpl *IdeaStoreApiImpl) ListIdeaById(ctx context.Context, req *idea_store_api.ListIdeaByIdRequest) (*idea_store_api.ListIdeaByIdResponse, error) {
	ideaItemList, err := idea_dao.StoreIdeaDao.ListById(ctx, req.IdeaIdList)
	if err != nil {
		return nil, err
	}
	ideaList := []*idea_store_api.IdeaInStore{}
	for _, ideaItem := range ideaItemList {
		ideaList = append(ideaList, ideaItem.ToIdeaInStore())
	}
	return &idea_store_api.ListIdeaByIdResponse{
		Code:     idea_store_api.ListIdeaByIdResponse_CODE_OK,
		IdeaList: ideaList,
	}, nil
}
